package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * IO流--传对象--高级流
 * ObjectOutputStream 对象输出流---传Person.java写操作
 * ObjectInputStream 对象输入流--传Person.java读操作
 *
 */
public class ObjectIO {
    /**
     * ObjectOutputStream 对象输出流
     * 使用方式：1.创建实现序列化接口的对象
     * 2.对象1输出流---xxx.obj文件
     * 传输对象，指定格式obj
     */
    @Test
    public void testOOS() throws IOException {
        //1.创建Person对象
        Person p = new Person();
        p.setName("韩美娟");
        //数组--静态数组
        //      String[] srt=("1","2","3"); 静态动态数组
        //      String[] str=new String[]{"1"};
        p.setSay(new String[]{"百因必有果，你的报应就是我~"});
        System.out.println("打印对象：" + p);

        //对象输出写出文件    xxx.obj         Person.java
        FileOutputStream fos = new FileOutputStream("person.obj");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        /**
         *  writeObject(Object obj)  ----理解：写出对象
         *该方法会将给定对象按照其结构进行转换
         * 转换为一组“组”字节，再通过其处理的流写出
         *
         * 写出文件专业术语
         * 1.通过对象输出流将Person类，先转换为一组"组"字节，这个过程【对象序列化】
         * 2.将序列化后的字节在通过字节流【低级流】写入文件中
         * 【硬盘上】做长久保存，这个过程【数据持久化】
         * 将person.obj持久化保存在硬盘上
         */
        oos.writeObject(p);
        System.out.println("写出成功~~");
    }
    /**
     * ObjectInputStream 对象输入流
     * 反序化：将对象转换为二进制
     * 反序列化：二进制转换为对象
     * readObject() 返回读取的对象【？】
     * 需求：将序列化person.obj文件 按照对象方式读入
     */
    @Test
    public void testOIS() throws IOException, ClassNotFoundException {
        //创建低级流
        FileInputStream fis = null;
        //创建高级流--对象读入
        ObjectInputStream ois = null;
        try {
            fis = new FileInputStream("person.obj");

            ois = new ObjectInputStream(fis);
            String line = null;
            while ((line = ois.readLine()) != null) {
                System.out.println("打印读到字符串" + line);
            }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //关闭高级流：字符输出流
                if (ois != null) {
                    try {
                        ois.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }
    }

